package com.heima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.heima.bean.ShoppingCart;
import com.heima.dao.ShoppingCartDao;
import com.heima.service.ShoppingCartService;
import com.heima.utils.BaseContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Service
@Transactional
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Autowired
    private ShoppingCartDao shoppingCartDao;

    /**
     * 添加购物车
     *   1. 加入购物车其实也是一个添加的动作，但是不能直接认为添加就完事了。
     *   2. 添加之前，先查询购物车有没有这件菜品|套餐
     *      2.1 按照user_id 和 dish_id | setmeal_id 来查询。
     *      2.2 如果查询出来，有数据，那么就执行更新操作。
     *          a. 就更新数量即可。 让原有的数量 + 1
     *      2.3 如果没有查询出来，那么表示这是第一次添加的数据
     *          a. 设置数量是 1.
     *
     * @param shoppingCart
     * @return 因为要在前端展示数据，所以要返回购物车数据，而不是平常的返回影响行数
     */
    @Override
    public ShoppingCart add(ShoppingCart shoppingCart) {
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();

        lqw.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());//在过滤器的时候就有存过用户id到线程中

        //菜品id和套餐id是出现在不同的请求数据中，所以以下两个条件是不可能同时存在的
        lqw.eq(shoppingCart.getDishId() != null, ShoppingCart::getDishId, shoppingCart.getDishId());
        lqw.eq(shoppingCart.getSetmealId() != null, ShoppingCart::getSetmealId, shoppingCart.getSetmealId());

        //执行查询
        ShoppingCart shoppingCart1 = shoppingCartDao.selectOne(lqw);

        //判断购物车数据库有没有该用户添加过的数据
        if (shoppingCart1 != null) {
            // 表明在数据库里面这个用户有添加过这个菜品|套餐 :: 更新的操作
            shoppingCart1.setNumber(shoppingCart1.getNumber() + 1);

            shoppingCartDao.updateById(shoppingCart1);

            return shoppingCart1;
        }
        // 表明在数据库里面这个用户没有添加过这个菜品|套餐 :: 添加的操作

        //补充数据
        shoppingCart.setUserId(BaseContext.getCurrentId());//用户id
        shoppingCart.setCreateTime(LocalDateTime.now());   //创建时间
        shoppingCart.setNumber(1);                         //设置数量
        //shoppingCart.setAmount();

        //添加
        shoppingCartDao.insert(shoppingCart);
        return shoppingCart;


    }

    /**
     * 查询购物车数据
     *
     * @return
     */
    @Override
    public List<ShoppingCart> list() {
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
        return shoppingCartDao.selectList(lqw);
    }

    /**
     * 清空购物车
     *
     * @return
     */
    @Override
    public int clean() {
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
        return shoppingCartDao.delete(lqw);
    }
}
